home *** CD-ROM | disk | FTP | other *** search
- {
- I tested out an 8 bit DAC mode with a 3d rendered image for ANIVGA v1.2
- compatible TeleGame SDK. There were portions of the image which actually
- popped out of the screen like a 3d movie. Now very realistic 3d sprites and
- images are possible with TeleGame. There is no impediment to display speed
- with this technique. The higher color variation allows anti-aliasing and
- smooth blending.
-
- Here is ATT 20c491 specific code from VGADOC3 for Orchid Fahrenheit VA/VLB:
- program Orchid;
- }
- uses ANIVGA, CRT;
- CONST
- Pic1 = 'HIPALACE.PIC';
- PalName = 'HI.PAL';
- ch : Char = #0;
- VAR
- i : Integer;
- dac8 : Boolean;
- DAC_RS2 : word; {These address bits are fed to the }
- {DAC_RS3 : word; RS2 and RS3 pins of the palette chip}
- daccomm : word; { temp to trigger DAC reads }
- Dac6Colors : Palette; { 6 bit dac RGB values 0..63 }
- Dac8Colors : Palette; { 8 bit dac RGB values 0..255 }
- type
- pel = record
- index, red, green, blue : byte;
- end;
- procedure disable; {Disable interupts}
- begin
- inline($fa); { CLI instruction }
- end; {disable}
- procedure enable; {Enable interrupts}
- begin
- inline($fb); { STI instruction }
- end; {enable}
- procedure outp(reg, val : word); {Write the low byte of VAL to I/O port REG}
- begin
- port[reg] := val;
- end; {outp}
- function inp(reg : word) : byte; {Reads a byte from I/O port REG}
- begin
- reg := port[reg];
- inp := reg;
- end; {inp}
- function trigdac : word; {Reads $3C6 4 times}
- var x : word;
- begin
- x := inp($3c6);
- x := inp($3c6);
- x := inp($3c6);
- trigdac := inp($3c6);
- end;
- procedure dac2pel; {Force DAC back to PEL mode}
- begin
- if inp($3c8)=0 then;
- end; {dac2pel}
- procedure dac2comm; {Enter command mode of HiColor DACs}
- begin
- dac2pel;
- daccomm := trigdac;
- end; {dac2comm}
- procedure readpelreg(index : word; var p : pel);
- begin
- p.index := index;
- disable;
- outp($3C7, index);
- p.red := inp($3C9);
- p.blue := inp($3C9);
- p.green := inp($3C9);
- enable;
- end; {readpelreg}
- procedure writepelreg(var p : pel);
- begin
- disable;
- outp($3C8, p.index);
- outp($3C9, p.red);
- outp($3C9, p.blue);
- outp($3C9, p.green);
- enable;
- end; {writepelreg}
- function setcomm(cmd : word) : word;
- begin
- dac2comm;
- outp($3c6, cmd);
- dac2comm;
- setcomm := inp($3c6);
- end; {setcomm}
- function dacis8bit : boolean;
- var
- pel2, x, v : word;
- pel1 : pel;
- begin
- pel2 := inp($3C8);
- readpelreg(255, pel1);
- v := pel1.red;
- pel1.red := 255;
- writepelreg(pel1);
- readpelreg(255, pel1);
- x := pel1.red;
- pel1.red := v;
- writepelreg(pel1);
- outp($3C8, pel2);
- dacis8bit := (x=255);
- end; {dacis8bit}
- function prepDAC : word; {Sets DAC up to receive command word}
- begin
- dac2comm;
- prepDAC := inp($3C6);
- dac2comm;
- end; {prepDAC}
- procedure dacmode(andmsk, ormsk : word);
- begin
- ormsk := ormsk and (not andmsk);
- if DAC_RS2 <> 0 then
- begin
- outp($3C6+DAC_RS2,(inp($3C6+DAC_RS2) AND andmsk) OR ormsk);
- end
- else begin
- outp($3C6,(prepDAC AND andmsk) OR ormsk);
- dac2pel;
- end;
- end; {dacmode}
- procedure testdac; {Test for type of DAC}
- begin
- DAC_RS2 := 0;
- { DAC_RS3 := 0; }
- end;
- procedure setdac6;
- begin
- dacmode(0, 0);
- end; {setdac6}
- procedure setdac8;
- begin
- dacmode($FD, 2);
- end; {setdac8}
- BEGIN {main}
- testdac;
- dac8 := false; {default is normal VGA 6 bit RGB values}
- InitGraph;
- IF LoadPalette(PalName, 0, actualColors) =0
- THEN BEGIN
- CloseRoutines;
- WRITELN('Couldn''t access file '+PalName+' : '+GetErrorMessage);
- Halt
- END
- ELSE BEGIN
- SetPalette(actualColors,TRUE);
- move(actualColors, Dac6Colors, SizeOf(Palette));
- END;
- { sample 8 bit palette converted from a 6 bit palette }
- move(actualColors, Dac8Colors, SizeOf(Palette));
- { index, red, green, blue }
- for i := 0 to 63 do begin
- Dac8Colors[i].red := i*4;
- Dac8Colors[i].green := 0;
- Dac8Colors[i].blue := 0;
- Dac8Colors[i+$40].red := 0;
- Dac8Colors[i+$40].green := i*4;
- Dac8Colors[i+$40].blue := 0;
- Dac8Colors[i+$80].red := 0;
- Dac8Colors[i+$80].green := 0;
- Dac8Colors[i+$80].blue := i*4;
- Dac8Colors[i+$C0].red := i*4;
- Dac8Colors[i+$C0].green := i*4;
- Dac8Colors[i+$C0].blue := i*4;
- end; {for}
- LoadPage(Pic1, SCROLLPAGE);
- GetBackgroundFromPage(SCROLLPAGE);
- Animate; {just to initialize pages}
- repeat
- if keypressed then while keypressed do ch := upcase(readkey);
- case ch of
- 'F': FadeIn(BACKGNDPAGE,2000,Fade_Squares); { sample fade }
- 'P': begin { pixel noise }
- FillPage(1-PAGE, Black);
- FOR i := 1 TO 20000 DO
- BEGIN
- PutPixel(Random(Succ(XMAX)),Random(Succ(YMAX)),Random(256));
- END;
- end;
- ' ': begin { Space toggles DAC 8/6 }
- dac8 := not dac8;
- if dac8 then begin
- setdac8;
- SetPalette(Dac8Colors, FALSE);
- OutTextXY(16,10,BACKGNDPAGE,'DAC=8');
- end
- else begin
- setdac6;
- SetPalette(Dac6Colors, FALSE);
- end;
- end;
- end; {case}
- until (ch = #27)
- setdac6;
- dac2comm; {Reset DAC}
- outp($3c6,0);
- dac2pel;
- CloseRoutines;
- END.